package com.itheima.service.imp;

import com.itheima.mapper.UserMapper;
import com.itheima.pojo.PageQuery;
import com.itheima.pojo.PageResult;
import com.itheima.pojo.User;
import com.itheima.pojo.UserLoginVo;
import com.itheima.service.UserService;
import com.itheima.service.utils.JwtUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

//缺少验证,当前端传过来的页码是不合理的时候可以通过验证重新设置为合理的值,再把当前页传递回去
//若总记录数无法被每页显示数量整除，那么最后一页会显示剩余的记录。所以，需要额外增加一页来展示这些剩余记录。
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    /***
     * 登录流程
     * @param user
     * @return
     */
    @Override
    public UserLoginVo login(User user) {
        //1、查询用户
        User userInfo = userMapper.login(user);

        //2、如果能查询到，则生成令牌
        if(userInfo!=null){
            //将第1个参数的属性值，复制给第2个参数
            UserLoginVo vo = new UserLoginVo();
            BeanUtils.copyProperties(userInfo,vo);
            //生成token令牌
            Map<String,Object> payload = new HashMap<>();
            payload.put("id",userInfo.getId());
            payload.put("username",userInfo.getUsername());
            payload.put("name",userInfo.getName());
            String token = JwtUtils.generateJwt(payload);

            vo.setToken(token);
            return vo;
        }
        //3、否则返回null
        return null;
    }
    @Override
    public PageResult page(PageQuery<User> pageQuery) {
//        查询总数量
//        此时pageQuery.getT()得到的将是用户传来的对应User类型的每个值
        long total = userMapper.count(pageQuery.getT());

//        分页查询
        List<User> list = userMapper.list(pageQuery);


        int pages = (int) (total%pageQuery.getPageSize()==0?total/ pageQuery.getPageSize():total/ pageQuery.getPageSize()+1);

         PageResult pageResult = PageResult.builder()
                 .currentPage(pageQuery.getPage())
                 .total(total)
                 .pages(pages)
                 .build();
//         集合数据
         pageResult.setData(list);
         return pageResult;


    }
}
